/// 智能指针
/*
指针 （pointer）是一个包含内存地址的变量的通用概念。这个地址引用，或 “指向”（points at）一些其他数据。
Rust 中最常见的指针是第 4 章介绍的 引用（reference）。引用以 & 符号为标志并借用了它们所指向的值。
除了引用数据没有任何其他特殊功能。它们也没有任何额外开销，所以应用得最多。

另一方面，智能指针（smart pointers）是一类数据结构，它们的表现类似指针，但是也拥有额外的元数据和功能。
智能指针的概念并非 Rust 独有：其起源于 C++，也存在于其他语言中。Rust 标准库中不同的智能指针提供了多于引用的额外功能。
本章将会探索的一个例子便是 引用计数 （reference counting）智能指针类型，其允许数据有多个所有者。
引用计数智能指针记录总共有多少个所有者，并当没有任何所有者时负责清理数据。

在 Rust 中，普通引用和智能指针的一个额外的区别是引用是一类只借用数据的指针；相反，在大部分情况下，智能指针 拥有 它们指向的数据。

实际上本书中已经出现过一些智能指针，比如第 8 章的 String 和 Vec<T>，虽然当时我们并不这么称呼它们。
这些类型都属于智能指针因为它们拥有一些数据并允许你修改它们。它们也带有元数据（比如它们的容量）
和额外的功能或保证（String 的数据总是有效的 UTF-8 编码）。

智能指针通常使用结构体实现。智能指针区别于常规结构体的显著特性在于其实现了 Deref 和 Drop trait。

这里将会讲到的是来自标准库中最常用的一些智能指针：
    Box<T>，用于在堆上分配值
    Rc<T>，一个引用计数类型，其数据可以有多个所有者
    Ref<T> 和 RefMut<T>，通过 RefCell<T> 访问（ RefCell<T> 是一个在运行时而不是在编译时执行借用规则的类型）
*/
/// 使用 Box<T> 指向堆上的数据
/*
最简单直接的智能指针是 box，其类型是 Box<T>。 box 允许你将一个值放在堆上而不是栈上。留在栈上的则是指向堆数据的指针。
如果你想回顾一下栈与堆的区别请参考第 4 章。
除了数据被储存在堆上而不是栈上之外，box 没有性能损失。不过也没有很多额外的功能。它们多用于如下场景：
    当有一个在编译时未知大小的类型，而又想要在需要确切大小的上下文中使用这个类型值的时候
    当有大量数据并希望在确保数据不被拷贝的情况下转移所有权的时候
    当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候
*/
fn main() {
    let b = Box::new(5);
    println!("b = {}", b);
}
